package com;

/**
 * 如果访问了一个对象的加锁的成员方法的时候,该对象所有加着 synchronized 修饰的成员方法,都会锁定
 * 
 * 和没加锁的成员方法以及 加锁,不加锁的静态方法无关
 * 
 * 如果访问了一个类的加锁的静态方法的时候,该类所有加着 synchronized 修饰的静态方法,全部被锁定
 * 
 * 和没加锁的静态方法以及加锁/不加锁的成员方法无关
 * 
 * @author lenovo
 * @date 2020年7月24日
 */
public class Thread_11_Synchronized {

	public static void main(String[] args) {
		Thread t1 = new Thread(new Processor12());
		Thread t2 = new Thread(new Processor12());
		Thread t3 = new Thread(new Processor12());
		t1.setName("t1");
		t2.setName("t2");
		t3.setName("t3");
		t1.start();
		t2.start();
		t3.start();
//		m2执行了
//		m1执行了
//		m3执行了

	}

}

class Processor12 implements Runnable {

	@Override
	public void run() {
		if ("t1".equals(Thread.currentThread().getName())) {
			MyClass.m1();
		} else if ("t2".equals(Thread.currentThread().getName())) {
			MyClass.m2();
		} else if ("t3".equals(Thread.currentThread().getName())) {
			MyClass.m3();
		}
	}

}

class MyClass {
	public synchronized static void m1() {
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("m1执行了");
	}

	public synchronized static void m2() {
		System.out.println("m2执行了");
	}

	public synchronized static void m3() {
		System.out.println("m3执行了");
	}
}